package leetcode;

/**
 * Leettcode622【设计循环队列】
 * https://leetcode-cn.com/problems/design-circular-queue/
 */
public class MyCircularQueue {
    private Integer[] data ;
    private int head;
    private int tail;
    public MyCircularQueue(int k) {
        this.data = new Integer[k + 1];
    }

    public boolean enQueue(int value) {//向循环队列插入一个元素。如果成功插入则返回真。
        if (isFull()){
            return false;
        }else {
            data[tail] = value;
            tail = (tail + 1) % data.length;
            return true;
        }
    }

    public boolean deQueue() {//从循环队列中删除一个元素。如果成功删除则返回真。
        if (isEmpty()){
            return false;
        }else {
            head = (head + 1) % data.length;
            return true;
        }
    }

    public int Front() {//从队首获取元素。如果队列为空，返回 -1 。
        if (isEmpty()){
            return -1;
        }else {
            return data[head];
        }
    }

    public int Rear() {//获取队尾元素。如果队列为空，返回 -1 。
        if (isEmpty()){
            return -1;
        }else {
            int lsatIndex = tail == 0 ? data.length - 1 : tail - 1;
            return data[lsatIndex];
        }
    }

    public boolean isEmpty() {
        return head == tail;
    }

    public boolean isFull() {
        return (tail + 1) % data.length == head;
    }
}
